﻿using System;

namespace LAPI.Business.Gestores
{
    /// <summary>
    /// Clase que implementa funciones para gestionar operaciones sobre la entidad de base de datos 'DeportesPista'
    /// </summary>
    public class GestorDeportesPista
    {
        /// <summary>
        /// Logger de la clase
        /// </summary>
        private LAPI.Core.Logging.ILogger logger;

        /// <summary>
        /// Constructor
        /// </summary>
        public GestorDeportesPista()
        {
            logger = LAPI.Core.Logging.LoggerFactory.CreateLogger(type: typeof(GestorDeportesPista));
        }

        #region Getter
        /// <summary>
        /// Método para obtener un listado de todos los deportes para una pista (activos y no activos)
        /// </summary>
        /// <param name="IdPista">Identificador único de la pista</param>
        /// <param name="IdCentroDeportivo">Identificador único del centro deportivo</param>
        /// <returns>Una colección del modelo con todos los deportes para esa pista</returns>
        /// <seealso cref="DeportePista"/>
        /// <seealso cref="GestorBBDD"/>
        public System.Collections.Generic.List<LAPI.Data.Model.DeportePista> ObtenerTodos(Int32 IdPista, Int32 IdCentroDeportivo)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            System.Collections.Generic.List<LAPI.Data.Model.DeportePista> result;

            sql.Append("Select ");
            sql.Append(LAPI.Data.Model.DeportePista.Columns);
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.DeportePista.Tables);
            sql.Append(" where ");
            sql.Append(" pista.id_pista = deportespista.id_pista");
            sql.Append(" and deportes.id_deportes = deportespista.id_deportes");
            sql.Append(" and pista.id_pista = " + IdPista);
            sql.Append(" and pista.id_centrodeportivo = centrodeportivo.id_centrodeportivo");
            sql.Append(" and centrodeportivo.id_centrodeportivo = " + IdCentroDeportivo);
            
            try
            {
                oBBDD.Abrir();
                result = LAPI.Data.Model.DeportePista.toModel(oBBDD.Select(sql.ToString()));
                oBBDD.CerrarParcial();
                return result;
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return null;
            }           
        }

        /// <summary>
        /// Método para obtener un deporte de una pista 
        /// </summary>
        /// <param name="IdDeportePista">Identificador único del deporte para la pista</param>
        /// <returns>Una colección del modelo con todos los deportes para esa pista</returns>
        /// <seealso cref="DeportePista"/>
        /// <seealso cref="GestorBBDD"/>
        public LAPI.Data.Model.DeportePista ObtenerPorID(Int32 IdDeportePista)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            System.Collections.Generic.List<LAPI.Data.Model.DeportePista> result;

            sql.Append("Select ");
            sql.Append(LAPI.Data.Model.DeportePista.Columns);
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.DeportePista.Tables);
            sql.Append(" where ");
            sql.Append(" pista.id_pista = deportespista.id_pista");
            sql.Append(" and deportes.id_deportes = deportespista.id_deportes");
            sql.Append(" and pista.id_centrodeportivo = centrodeportivo.id_centrodeportivo");
            sql.Append(" and id_deportespista = " + IdDeportePista);

            try
            {
                oBBDD.Abrir();
                result = LAPI.Data.Model.DeportePista.toModel(oBBDD.Select(sql.ToString()));
                oBBDD.CerrarParcial();
                return result[0];
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return null;
            }
        }

        /// <summary>
        /// Método para obtener un deporte de una pista 
        /// </summary>
        /// <param name="IdPista">Identificador único de la pista</param>
        /// <param name="IdDeporte">Identificador único del deporte</param>
        /// <returns>Una colección del modelo con todos los deportes para esa pista</returns>
        /// <seealso cref="DeportePista"/>
        /// <seealso cref="GestorBBDD"/>
        public LAPI.Data.Model.DeportePista ObtenerPorID(Int32 IdPista, Int32 IdDeporte)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            System.Collections.Generic.List<LAPI.Data.Model.DeportePista> result;

            sql.Append("Select ");
            sql.Append(LAPI.Data.Model.DeportePista.Columns);
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.DeportePista.Tables);
            sql.Append(" where ");
            sql.Append(" pista.id_pista = deportespista.id_pista");
            sql.Append(" and deportes.id_deportes = deportespista.id_deportes");
            sql.Append(" and pista.id_centrodeportivo = centrodeportivo.id_centrodeportivo");
            sql.Append(" and deportespista.id_pista = " + IdPista);
            sql.Append(" and deportespista.id_deportes = " + IdDeporte);

            try
            {
                oBBDD.Abrir();
                result = LAPI.Data.Model.DeportePista.toModel(oBBDD.Select(sql.ToString()));
                oBBDD.CerrarParcial();
                return result[0];
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return null;
            }
        }

      #endregion

        #region Comprobaciones

        /// <summary>
        /// Método para comprobar si existe en la misma pista, el mismo deporte asignado ya
        /// </summary>
        /// <param name="model">Modelo del deporte para pista</param>
        /// <returns>True si no existe. False si ocurre lo contrario</returns>
        /// <seealso cref="DeportePista"/>
        /// <seealso cref="GestorBBDD"/>
        public Boolean ComprobarDeportePista(LAPI.Data.Model.DeportePista model)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            System.Collections.Generic.List<LAPI.Data.Model.DeportePista> result;

            sql.Append("Select 1");
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.DeportePista.Table);
            sql.Append(" where id_deportes = " + model.idDeporte);
            sql.Append(" and id_pista = " + model.idPista);

            try
            {
                oBBDD.Abrir();
                result = LAPI.Data.Model.DeportePista.toModel(oBBDD.Select(sql.ToString()));
                oBBDD.CerrarParcial();

                if (result.Count > 0)
                    return false;
                return true;
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return false;
            }
        }


#endregion

        #region insert

        /// <summary>
        /// Método para insertar un nuevo deporte para una pista en la base de datos
        /// </summary>
        /// <param name="datosDeportePista">Modelo con los datos del deporte para pista a insertar (previamente validados)</param>
        /// <seealso cref="DeportePista"/>
        /// <seealso cref="GestorBBDD"/>
        public void Insertar(LAPI.Data.Model.DeportePista datosDeportePista)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Insert into ");
            sql.Append(LAPI.Data.Model.DeportePista.Table);
            sql.Append(" ( ");
            sql.Append(datosDeportePista.ToInsertColumns());
            sql.Append(" ) values ( ");
            sql.Append(datosDeportePista.ToInsertValues());
            sql.Append(" ) ");            

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Insert(sql.ToString());               
                oBBDD.CerrarParcial();
                if (result != 1)
                    throw new Exception("No se ha insertado el registro: " + datosDeportePista);
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                throw new Exception("No se ha insertado el registro: " + datosDeportePista);
            }           
        }

        #endregion

        #region update

        /// <summary>
        /// Método para actualizar los datos 'cambiantes' del deporte para la pista
        /// </summary>
        /// <param name="datosDeportePista">Modelo con los datos del deporte para la pista</param>
        /// <seealso cref="DeportePista"/>
        /// <seealso cref="GestorBBDD"/>
        public void Actualizar(LAPI.Data.Model.DeportePista datosDeportePista)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Update ");
            sql.Append(LAPI.Data.Model.DeportePista.Table);
            sql.Append(" set ");
            sql.Append(datosDeportePista.ToUpdate());
            sql.Append(" where id_deportespista =" + datosDeportePista.idDeportePista);

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Update(sql.ToString());
                oBBDD.CerrarParcial();
                if (result != 1)
                    throw new Exception("No se ha actualizado el registro: " + datosDeportePista);
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                throw new Exception("No se ha actualizado el registro: " + datosDeportePista);
            }
        }

        /// <summary>
        /// Método para actualizar el estado de un deporte para una pista
        /// </summary>
        /// <param name="datosDeportePista">Modelo con los datos del deporte para la pista</param>
        /// <seealso cref="DeportePista"/>
        /// <seealso cref="GestorBBDD"/>
        public void ActualizarEstado(LAPI.Data.Model.DeportePista datosDeportePista)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Update ");
            sql.Append(LAPI.Data.Model.DeportePista.Table);
            sql.Append(" set ");
            sql.Append(datosDeportePista.ToUpdateEstado());
            sql.Append(" where id_deportespista =" + datosDeportePista.idDeportePista);

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Update(sql.ToString());
                oBBDD.CerrarParcial();
                if (result != 1)
                    throw new Exception("No se ha actualizado el registro: " + datosDeportePista);
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                throw new Exception("No se ha actualizado el registro: " + datosDeportePista);
            }
        }

        #endregion

        #region delete

        

        #endregion
    }
}
